# coding: utf8


# coefficients used to calculate combined-score
ART_SCORE_PROPOTION = {
    '文编': (0.7, 0.3),
    '播音': (0.7, 0.3),
    '美术': (0.3, 0.7),
    '体育': (0.3, 0.7*7.5),
    '书法': (0.4, 0.6),
    '航服': (0.7, 0.3)
}


def com_score(*args):
    """
    计算综合分数
    :parameter 参数
    *args: 不确定个数的元组（float, float）, 各科目分数及合成系数
    :return 返回值
    score: float, 合成分数

    >>> com_score((100, 0.3), (80, 0.7))
    86.0
    """
    from operator import mul
    return sum(mul(*x) for x in args)


def com_score_art(uni_score, art_score, mode='文编', ndigits=2):
    """
    计算艺术综合分数
    mode：str，值域={"美术"，“文编”， “播音”，“书法”，“体育”}
    uni_score: float, 统一考试分数
    art_score：float, 艺术专业分数
    ndigits: 保留小数位数，缺省值=2. 使用Python内置的舍人函数round， 与四舍五入方式不同

    >>> com_score_art(451, 200, mode='美术')
    '275.30'
    >>> com_score_art(170.5, 10, mode='美术', ndigits=1)
    '58.2'
    >>> com_score_art(5, 10, mode='美术', ndigits=0)
    '9'
    """
    # 各类别系数
    prop = ART_SCORE_PROPOTION
    # 合成分数
    com_socre = sum(x * y for x, y in zip((uni_score, art_score), prop[mode]))
    # 返回字符串，保留nidigits位小数位
    return format(com_socre, '{:.2f}'.format(ndigits))


def com_score_art_round45(unitest_score, art_score, mode='文编', ndigits=2):
    """
    计算艺术综合分数
    mode：str，值域={"美术"，“文编”， “播音”，“书法”，“体育”}
    unitest: float, 统一考试文化分数
    major：float, 专业分数
    ndigits: int, 保留小数位数
    return str， 综合分数， 使用decimal的ROUND_HALF_UP模式, 等同四舍五入

    >>> com_score_art_round45(451, 200, mode='文编')
    '375.70'
    >>> com_score_art_round45(170.5, 10, mode='美术', ndigits=1)
    '58.2'
    >>> com_score_art_round45(5, 10, mode='美术', ndigits=0)
    '9'
    """
    # 使用高精度十进制计算模块和四舍五入方式
    import decimal
    decimal.getcontext().rounding = decimal.ROUND_HALF_UP
    # 各类别系数
    D = decimal.Decimal
    r03, r07, r04, r06 = D('0.3'), D('0.7'), D('0.4'), D('0.6')
    prop = ART_SCORE_PROPOTION
    # 合成分数
    comp_socre = sum(D(x) * ratio for x, ratio in zip((unitest_score, art_score), prop[mode]))
    # 使用 ROUND_HALF_UP 方式进行舍入（四舍五入）
    comp_socre = round(comp_socre, ndigits)
    # 返回字符串，保留 nidigits 位小数位
    return str(comp_socre)


if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)
